package com.futao.configuration;

import com.futao.mapper.UserMapper;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.springframework.context.annotation.Bean;

import javax.annotation.Resource;
import javax.sql.DataSource;

/**
 * @author futao
 * Created on 18-6-14-上午10:51.
 * 1.mybatis配置
 * 2.获取SqlSession
 */
@org.springframework.context.annotation.Configuration
public class MybatisConfiguration {

    @Resource
    private DataSource dataSource;

    /**
     * 每个线程都应该有它自己的 SqlSession 实例
     * SqlSession 的实例不是线程安全的
     * 因此是不能被共享的
     * 所以它的最佳的作用域是请求或方法作用域
     * 绝对不能将 SqlSession 实例的引用放在一个类的静态域
     * 甚至一个类的实例变量也不行
     * 也绝不能将 SqlSession 实例的引用放在任何类型的管理作用域中
     * 比如 Servlet 架构中的 HttpSession
     * 如果你现在正在使用一种 Web 框架
     * 要考虑 SqlSession 放在一个和 HTTP 请求对象相似的作用域中
     * 换句话说，每次收到的 HTTP 请求
     * 就可以打开一个 SqlSession
     * 返回一个响应
     * 就关闭它
     * 这个关闭操作是很重要的
     * 你应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭
     *
     * @return
     */
    @Bean
    public SqlSessionFactory sqlSessionFactory() {
        TransactionFactory transactionFactory = new JdbcTransactionFactory();
        Environment environment = new Environment("development", transactionFactory, dataSource);
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(environment);
        configuration.addMapper(UserMapper.class);
        return new SqlSessionFactoryBuilder().build(configuration);
//        return new SqlSessionFactoryBuilder().build(configuration).openSession();
    }
}
